1. 题目描述(简单难度)

[success] 226. 翻转二叉树

2. 解法一: 使用递归

我们从根节点开始,递归地对树进行遍历,并从叶子结点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以root 为根节点的整棵子树的翻转。

class Solution {
    public TreeNode invertTree(TreeNode root) {
     if(root == null){
         return null;
     }
     TreeNode temp = root.left;
     root.left = root.right;
     root.right = temp;

     invertTree(root.left);
     invertTree(root.right);

     return root;
    }
}

3. 解法二: 使用队列进行 BFS

递归实现也就是深度优先遍历的方式,那么对应的就是广度优先遍历。 广度优先遍历需要额外的数据结构--队列,来存放临时遍历到的元素。 深度优先遍历的特点是一竿子插到底,不行了再退回来继续;而广度优先遍历的特点是层层扫荡。 所以,我们需要先将根节点放入到队列中,然后不断的迭代队列中的元素。 对当前元素调换其左右子树的位置,然后:

  • 判断其左子树是否为空,不为空就放入队列中
  • 判断其右子树是否为空,不为空就放入队列中
class Solution {
    public TreeNode invertTree(TreeNode root) {
       Deque<TreeNode> deque = new LinkedList<>();
       deque.offer(root);
       while(!deque.isEmpty()){
            TreeNode curr = deque.poll();
            if(curr == null){
                continue;
            }
            TreeNode temp = curr.left;
            curr.left = curr.right;
            curr.right = temp;

            deque.offer(curr.left);
            deque.offer(curr.right);
       }
       return root;
    }
}
© gaohueric all right reserved,powered by Gitbook文件修订时间: 2021-12-08 23:22:22

results matching ""

    No results matching ""